#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>
using namespace std;
static int count = 0;
void catchSig(int signum)
{
    cout << "捕捉到一个信号：该信号是:  " << signum << endl;
}
void validate_No_1Signal()
{
    for (int i = 0; i < 32; i++) // 注册所有常用信号处理函数
        signal(i, catchSig);
    while (1)
        sleep(1);
}
static void showPending(sigset_t &pending)
{
    for (int sig = 1; sig <= 31; sig++)
        if (sigismember(&pending, sig)) // 判断该号信号是否在pending信号集里
            cout << " 1";
        else
            cout << "0";
    cout << endl;
}
int main()
{
    // 0.方便测试，不要执行2号的默认执行进程
    signal(2, catchSig);
    // 1.定义信号集，由于在函数内定义的变量都在栈上，所以这两个信号集
    // 属于用户空间
    sigset_t bset, boldset;
    sigset_t pending;
    // 2.初始化信号集
    sigemptyset(&bset);
    sigemptyset(&boldset);
    // 3.向集合添加要屏蔽的信号
    sigaddset(&bset, 2);
    // 4.设置set到内核中对应的进程内部【默认情况下进程不会对任何信号屏蔽】
    int n = sigprocmask(SIG_BLOCK, &bset, &boldset);
    assert(n == 0);
    (void)n; // 消除警告
    // 5.重复打印当前进程的pending信号集
    while (true)
    {

        // 获取当前进程的pending 信号集
        sigpending(&pending);
        // 显示pending信号集中没有被递达的信号
        showPending(pending);
        sleep(1);
        count++;
        // 加到20就接触屏蔽
        if (count == 20)
        {
            // 通过使用记录的老的pending表来恢复原始信号集，也可以用SIG_UNBLOCK恢复
            int n = sigprocmask(SIG_SETMASK, &boldset, nullptr);
            assert(n == 0);
            (void)n; // 消除警告
            cout << "解除2号信号的block" << endl;
        }
    }
    return 0;
}